﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL.Abstract;
using System.Data.SqlClient;

namespace DAL
{
    public class UsuarioDAL : abstractDAL
    {
        public Usuario getUsuarioByID(int id)
        {
            try
            {
                return
                (from u in Wiki.Usuarios
                 where u.idUsuario == id
                 select u).SingleOrDefault();
            }
            catch (SqlException)
            {
                throw;
            }
            
        }
        public List<Usuario> getAllUsuarios()
        {
            try
            {
                return
                (from u in Wiki.Usuarios
                 select u).ToList();
            }
            catch (SqlException)
            {
                throw;
            }

        }

        public void InsertUsuario(Usuario user)
        {
            try
            {
                Wiki.Usuarios.InsertOnSubmit(user);
                Wiki.SubmitChanges();
            }
            catch (SqlException)
            {
                throw;
            }
            
        }

        public Usuario GetUsuarioByLoginAndPassword(string login, string pass)
        {
            try
            {
                return (from u in Wiki.Usuarios
                        where u.login == login && u.senha == pass
                        select u).SingleOrDefault();
            }
                catch (Exception)
            {
                
                throw;
            }
        }

        public List<Usuario> getUsersWithMorePoints(int topUsers)
        {
            try
            {
                List<Usuario> listAllUsers = this.getAllUsuarios();

                return listAllUsers.OrderByDescending(x => x.pontos).Take(topUsers).ToList();
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public List<Usuario> GetSeguidoresByUsuario(Usuario usuarioSeguido)
        {
            try
            {
                List<int> idsUsuariosSeguidores = (from u in Wiki.Usuarios
                                                   join s in Wiki.Segmentos on u.idUsuario equals s.idUsuarioSeguido
                                                   where s.idUsuarioSeguido == usuarioSeguido.idUsuario
                                                   select s.idUsuarioSeguidor).ToList();

                List<Usuario> lstUsuariosSeguidores = new List<Usuario>();

                for (int i = 0; i < idsUsuariosSeguidores.Count; i++)
                {
                    lstUsuariosSeguidores.Add((from u in Wiki.Usuarios
                                               where u.idUsuario == idsUsuariosSeguidores[i]
                                               select u).SingleOrDefault());
                }

                return lstUsuariosSeguidores;

            }
            catch (SqlException)
            {
                throw;
            }
        }

        public void IncrementaPontos(Usuario user)
        {
            try
            {
                user.pontos++;
                Wiki.AtualizaPontosUsuario(user.idUsuario, user.pontos);
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public void IncrementaPontos(Usuario user, int qtdPontos)
        {
            try
            {
                user.pontos = user.pontos + (qtdPontos);
                Wiki.AtualizaPontosUsuario(user.idUsuario, user.pontos);
            }
            catch (Exception)
            {

                throw;
            }
        }

        public List<Usuario> GetUsuariosByLogin(string login)
        {
            try
            {
                return (from u in Wiki.Usuarios
                        where u.login == login
                        select u).ToList();
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}
